package lol.clann.minecraft.springboot.api.bukkit.utils;

import lol.clann.minecraft.springboot.api.bukkit.model.BoundingBox;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;

/**
 * @author pyz
 * @date 2018/8/5 上午9:04
 */
public interface EntityUtils {
    /**
     * 将bukkitEntity转换成NMSEntity
     * @param entity
     * @param <T>
     * @return
     */
    <T> T toNMS(Entity entity);

    /**
     * 将NMSEntity转换成bukkitEntity
     * @param nmsEntity
     * @param <T>
     * @return
     */
    <T> Entity toBukkit(T nmsEntity);

    /**
     * 序列化
     * @param entity
     * @return
     */
    <T> T toNBTTagCompound(Entity entity);

    /**
     * 用nbt更新实体
     * @param entity
     * @param nbtTagCompound
     */
    <T> void applyNBTTagCompound(Entity entity, T nbtTagCompound);

    /**
     * 为零血修复提供支持
     * @param livingEntity
     * @return
     */
    Float getAbsorptionHearts(LivingEntity livingEntity);

    /**
     * 为零血修复提供支持
     * @param livingEntity
     * @param absorptionHearts
     */
    void setAbsorptionHearts(LivingEntity livingEntity, float absorptionHearts);

    /**
     * spigot有个机制,可以不运算刷怪笼刷出的生物的ai
     * 利用此机制可以控制实体AI是否运算,可用来优化服务器
     *
     * @param entity
     * @param fronzen
     */
    void setFronzen(Entity entity, boolean fronzen);

    /**
     * 判断盔甲架
     *
     * @param entity
     * @return
     */
    boolean isArmorStand(Entity entity);

    /**
     * 获取是实体的碰撞箱
     * @param entity
     * @return
     */
    BoundingBox getAxisAlignedBB(Entity entity);

    /**
     * 获取准星实体
     *
     * @param entity
     * @param distance
     * @return
     */
    Entity getTargetEntity(LivingEntity entity, float distance);

    /**
     * 判断实体是否可碰撞
     * 1.8及及下始终返回true
     *
     * @param livingEntity
     * @return
     */
    boolean isCollidable(LivingEntity livingEntity);
}
